package com.woniu.tms.manage.utils;


import com.woniu.tms.entity.Permission;
import org.springframework.stereotype.Component;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 工具类
 *
 * @author 周晨
 */
@Component
public class MyUtils {

    /**
     * 得到permission的树形结构
     *
     * @param nodes
     * @return 返回树形结构
     */
    public static List<Permission> getTree(List<Permission> nodes) {
        Map<Integer, Permission> map = new HashMap<>();
        //找出所有的根节点
        List<Permission> roots = new ArrayList<>();
        for (Permission node : nodes) {
            map.put(node.getPid(), node);
        }
        for (Permission node : nodes) {
            Permission temp = map.get(node.getParentid());
            if (temp != null) {
                temp.getChildren().add(node);
            } else {
                node.setOpen(true);
                roots.add(node);
            }
        }
        return roots;
    }

    /**
     * 获取当前时间，格式为（yyyyMMdd）
     *
     * @return 时间字符串
     */
    public static String getNowTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(new Date());
    }

    /**
     * 获取当前时间，格式为（yyyy-MM-dd）
     *
     * @return 时间字符串
     */
    public static String getDay() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(new Date());
    }

    /**
     * 产生n位随机数字
     *
     * @param n 随机的位数
     * @return 随机数字符串
     */
    private static String getRandom(int n) {
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < n; i++) {
            int random = (int) (Math.random() * 10);
            str.append(random);
        }
        return str.toString();
    }

    /**
     * 产生一个sno
     *
     * @param suffix sno的前缀（2位）
     * @return sno
     */
    public static String getSno(String suffix) {
        return suffix + getNowTime() + getRandom(4);
    }

    /**
     * Java代码实现MySQL数据库导出
     *
     * @param hostIP       MySQL数据库所在服务器地址IP
     * @param userName     进入数据库所需要的用户名
     * @param password     进入数据库所需要的密码
     * @param savePath     数据库导出文件保存路径
     * @param fileName     数据库导出文件文件名
     * @param databaseName 要导出的数据库名
     * @return 返回true表示导出成功，否则返回false。
     */
    public static boolean exportDatabaseTool(String hostIP, String userName, String password, String savePath, String fileName, String databaseName) throws InterruptedException {
        File saveFile = new File(savePath);
        // 如果目录不存在
        if (!saveFile.exists()) {
            // 创建文件夹
            saveFile.mkdirs();
        }
        if (!savePath.endsWith(File.separator)) {
            savePath = savePath + File.separator;
        }
        PrintWriter pw = null;
        BufferedReader bufferedReader = null;
        try {
            pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(savePath + fileName), StandardCharsets.UTF_8));
            Process process = Runtime.getRuntime().exec(" mysqldump -h" + hostIP + " -u" + userName + " -p" + password + " --set-charset=UTF8 " + databaseName);
            InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8);
            bufferedReader = new BufferedReader(inputStreamReader);
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                pw.println(line);
            }
            pw.flush();
            //0 表示线程正常终止。
            if (process.waitFor() == 0) {
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (pw != null) {
                    pw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }


    /**
     * @param filepath 数据库备份的脚本路径
     * @param ip       IP地址
     * @param database 数据库名称
     * @param userName 用户名
     * @param password 密码
     * @return 是否恢复成功
     */
    public static boolean recover(String filepath, String ip, String database, String userName, String password) {
        String stmt1 = "mysqladmin -h " + ip + " -u " + userName + " -p" + password + " create " + database;
        String stmt2 = "mysql -h " + ip + " -u " + userName + " -p " + password + " " + database + " < " + filepath;
        String[] cmd = {"cmd", "/c", stmt2};
        try {
            Runtime.getRuntime().exec(stmt1);
            Runtime.getRuntime().exec(cmd);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

}
